﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Prisa.Entities;
using Prisa.DataAccess;
using Microsoft.Practices.Unity;

namespace Prisa.BussinesLogic
{
    public class ProductoBL : IProductoBL
    {
        [Dependency]
        public IProductoDAO productoDAO { get; set; }

        [Dependency]
        public IHistorialVentaDAO historialDAO { get; set; }

        public List<PRODUCTO> GetAllFromProducto()
        {
            return productoDAO.GetAllFromProducto();
        }

        public List<PRODUCTO> GetFromProductoByDescripcion(string descripcion)
        {
            return productoDAO.GetFromProductoByDescripcion(descripcion);
        }

        public List<PRODUCTO> GetAllFromProductosByDescripcionAndStockBajo(string descripcion, int minStock)
        {
            return productoDAO.GetAllFromProductosByDescripcionAndStockBajo(descripcion, minStock);
        }

        public PRODUCTO GetOneProductoByDescripcion(string codigo)
        {
            return productoDAO.GetOneProductoByDescripcion(codigo);
        }

        public PRODUCTO GetFromProductoById(int id)
        {
            return productoDAO.GetFromProductoById(id);            
        }

        public void AddProducto(PRODUCTO producto)
        {
            var duplicidad = productoDAO.ExisteDuplicidadProdDescripcion(producto.Descripcion, producto.Id);

            if (!duplicidad)
            {
                var msg = "";
                var ok = producto.Validate(out msg);

                if (ok)
                {
                    if (producto.Precio > producto.Costo)
                    {
                        productoDAO.AddProducto(producto);
                    }
                    else
                    {
                        var error = string.Format("El precio de venta debe ser mayor al costo");
                        throw new Exception(error);
                    }
                }
                else
                {
                    throw new Exception(msg);
                }
            }
            else
            {
                var error = string.Format("Ya existe un producto con la misma descripción\n" +
                    "Producto: " + producto.Descripcion);
                throw new Exception(error);
            }          
        }

        public void UpdateProducto(PRODUCTO producto)
        {
            var duplicidad = productoDAO.ExisteDuplicidadProdDescripcion(producto.Descripcion, producto.Id);
            
	        if (!duplicidad)
	        {
                if (producto.Precio >= producto.Costo)
                {
                    var msg = "";
                    var ok = producto.Validate(out msg);
                    if (ok)
                    {
                        productoDAO.UpdateProducto(producto);
                    }
                    else
                    { 
                        throw new Exception(msg); 
                    }
                }
                else
                {
                    var error = string.Format("El precio de venta debe ser mayor al costo");
                    throw new Exception(error);
                }
            }
            else
            {
                var error = string.Format("Ya existe un producto con la misma descripción: \n{0}",producto.Descripcion);
                throw new Exception(error);
            }
                        
        }

        public void RemoveProducto(int id)
        {
            var hijos = historialDAO.GetAllHistorialByProductoId(id);

            if (hijos == true)
            {
                var error = string.Format("No se puede eliminar el Producto ");
                throw new Exception(error);
            }
            else
            {
                productoDAO.RemoveProducto(id);
            }
            
        }


        public bool ExisteDuplicidadProdDescripcion(string prodDescripcion, int id)
        {
            return productoDAO.ExisteDuplicidadProdDescripcion(prodDescripcion, id);
        }
    }
}
